package cliente.rn;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;

import cliente.gerenciadorcliente.so.SOGerenciadorClienteEntrada;
import cliente.gerenciadorcliente.so.SOGerenciadorClienteEntradaImpl;
import cliente.gerenciadorcliente.so.SOGerenciadorClienteSaida;
import cliente.gerenciadorcliente.so.SOGerenciadorClienteSaidaImpl;
import cliente.jogocliente.so.SOJogoClienteEntrada;
import cliente.jogocliente.so.SOJogoClienteEntradaImpl;
import cliente.jogocliente.so.SOJogoClienteSaida;
import cliente.jogocliente.so.SOJogoClienteSaidaImpl;
import cliente.so.SOClienteEntradaImpl;
import cliente.so.SOClienteSaida;
import cliente.so.SOClienteSaidaImpl;
import cliente.so.SOControladoraClienteIU;

import comum.so.SOServidorEntrada;

public class RNCliente {

	private static String ip = "localhost";
	
	private RNAutenticador autenticador;

	public RNCliente(SOClienteEntradaImpl clienteEntrada, SOClienteSaida clienteSaida) {
		setAutenticador(new RNAutenticador(clienteSaida));
		SOControladoraClienteIU controladoraIU = new SOControladoraClienteIU(getAutenticador(), clienteSaida);
		clienteEntrada.setControladoraIU(controladoraIU);
	}

	public static void main(String[] args) throws RemoteException {
		SOServidorEntrada servidorEntrada = null;
		try {
			System.setSecurityManager(new RMISecurityManager());
			servidorEntrada = (SOServidorEntrada) Naming
					.lookup("rmi://" + ip + "/servidorDomino");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
		
		SOClienteSaidaImpl clienteSaida = new SOClienteSaidaImpl();
		SOGerenciadorClienteEntrada gerenciadorClienteEntrada = new SOGerenciadorClienteEntradaImpl();
		SOClienteEntradaImpl clienteEntrada = new SOClienteEntradaImpl(clienteSaida);
		SOGerenciadorClienteSaida gerenciadorClienteSaida = new SOGerenciadorClienteSaidaImpl(
				clienteEntrada);
		SOJogoClienteSaida jogoClienteSaida = new SOJogoClienteSaidaImpl(clienteEntrada);
		SOJogoClienteEntrada jogoClienteEntrada = new SOJogoClienteEntradaImpl(jogoClienteSaida);
		
		clienteSaida.setGerenciadorClienteEntrada(gerenciadorClienteEntrada);
		clienteSaida.setGerenciadorClienteSaida(gerenciadorClienteSaida);
		clienteSaida.setServidorEntrada(servidorEntrada);
		clienteSaida.setJogoClienteEntrada(jogoClienteEntrada);
		clienteSaida.setClienteEntrada(clienteEntrada);
		
		new RNCliente(clienteEntrada, clienteSaida);
	}

	protected RNAutenticador getAutenticador() {
		return autenticador;
	}

	protected void setAutenticador(RNAutenticador autenticador) {
		this.autenticador = autenticador;
	}
}
